﻿using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Step4.Unit9.Filters;

namespace Step4.Unit9.Controllers
{
    [CustomerAuthorize] // 使用自定义的授权过滤器
    public class UserController : Controller
    {
        /// <summary>
        /// 所有进入控制器的请求，在Action执行前，执行某些共同逻辑
        /// 行为过滤器
        /// 行为前过滤器
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
        }

        /// <summary>
        /// 行为过滤器
        /// 行为后过滤器
        /// </summary>
        /// <param name="context"></param>
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

        List<UserInfo> list = new List<UserInfo>
        {
                new(1,"张三"),
                new(2,"李四")
        };


        // 一般用于查询
        [HttpGet]  // 要习惯性的添加"请求方式过滤"  (在webapi中尤其重要，在mvc中没有硬性要求)
        // [NoneAction]  添上此属性后，方法就不再是控制器的Action，外界将不可请求此方法
        // [ActionName("list")] 加上此属性后，Action在路由中被重命名
        public IActionResult GetList()
        {
            return Ok(list);
        }

       

        // 一般用于添加
        [HttpPost]
        public IActionResult AddUser([FromBody] UserInfo user)  // [FromBody] 属于"请求资源过滤器"，还有 [FromForm]、[FromQuery]等
        {
            list.Add(user);
            return Ok(list);
        }

        // 一般用于修改
        [HttpPut]
        public IActionResult UpdateUser([FromBody] UserInfo user)
        {
            var userInfo = list.FirstOrDefault(p => p.Id == user.Id);
            userInfo.Name = user.Name; // 因为此处userInfo 和 list中Id==user.Id 的项目指向的内存堆地址相同，所以看作是"同一个对象"，所以可以直接修改
            return Ok(list);
        }

        // 一般用于删除
        [HttpDelete]
        public IActionResult DeleteUser(int id)
        {
            var user = list.FirstOrDefault(p => p.Id == id);
            list.Remove(user);
            return Ok(list);
        }
    }
}

public record UserInfo
{
    public UserInfo()
    { 
    
    }

    public UserInfo(int id, string? name)
    {
        Id = id;
        Name = name;
    }

    public int Id { get; set; }
    public string? Name { get; set; }
}